home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / c / vbcc / pasm / errors.c < prev    next >
C/C++ Source or Header  |  1998-01-05  |  7KB  |  216 lines

  1. /* $VER: pasm errors.c V0.6 (30.10.97)
  2.  *
  3.  * This file is part of pasm, a portable PowerPC assembler.
  4.  * Copyright (c) 1997  Frank Wille
  5.  *
  6.  * pasm is freeware and part of the portable and retargetable ANSI C
  7.  * compiler vbcc, copyright (c) 1995-97 by Volker Barthelmann.
  8.  * pasm may be freely redistributed as long as no modifications are
  9.  * made and nothing is charged for it. Non-commercial usage is allowed
  10.  * without any restrictions.
  11.  * EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
  12.  * SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
  13.  *
  14.  *
  15.  * v0.6 (30.10.97) phx
  16.  *      New error messages.
  17.  * v0.5 (12.10.97) phx
  18.  *      New error messages.
  19.  * v0.4 (05.07.97) phx
  20.  *      Program returns EXIT_FAILURE if an error occurs.
  21.  *      New error messages. Error 33 is a warning now.
  22.  * v0.2 (25.03.97) phx
  23.  *      Writes ELF object for 32-bit PowerPC big-endian. Either absolute
  24.  *      or ELF output format may be selected. ELF is default for all
  25.  *      currently supported platforms. PPCasm supports nine different
  26.  *      relocation types (there are much more...).
  27.  *      Compiles and works also under NetBSD/amiga (68k).
  28.  *      Changed function declaration to 'new style' in all sources
  29.  *      (to avoid problems with '...' for example).
  30.  *      Warnings can be disabled.
  31.  * v0.1 (11.03.97) phx
  32.  *      First test version with all PowerPC instructions and most
  33.  *      important directives. Only raw, absolute output.
  34.  * v0.0 (14.02.97) phx
  35.  *      File created. Project started.
  36.  */
  37.  
  38.  
  39. #define ERRORS_C
  40. #include "ppcasm.h"
  41.  
  42.  
  43. /* error flags */
  44. #define EF_NONE 0
  45. #define EF_WARNING 1
  46. #define EF_ERROR 2
  47. #define EF_FATAL 3
  48. #define EF_TYPEMASK 0xf
  49.  
  50. #define EF_NOLINE 0x10
  51.  
  52.  
  53. void error(int,...);
  54. void ierror(char *,...);
  55.  
  56.  
  57.  
  58. static struct {
  59.   char *txt;
  60.   int flags;
  61. } errors[] = {
  62.   "No error",EF_NONE|EF_NOLINE,
  63.   "Out of memory",EF_FATAL|EF_NOLINE,                               /* 01 */
  64.   "Missing source file name",EF_FATAL|EF_NOLINE,
  65.   "Missing output file name",EF_FATAL|EF_NOLINE,
  66.   "Multiple source file names detected",EF_FATAL|EF_NOLINE,
  67.   "File \"%s\" has a read error",EF_FATAL|EF_NOLINE,                /* 05 */
  68.   "Can't open \"%s\"",EF_FATAL|EF_NOLINE,
  69.   "Symbol \"%s\" defined twice",EF_ERROR,
  70.   "Macro \"%s\" defined twice",EF_ERROR,
  71.   "Reference to undefined macro parameter \\%d",EF_ERROR,
  72.   "Unknown opcode \"%s\"",EF_ERROR,                                 /* 10 */
  73.   "Too many macro parameters",EF_ERROR,
  74.   "Colon expected",EF_ERROR,
  75.   "Syntax error",EF_ERROR,
  76.   "String constant expected",EF_ERROR,
  77.   "Illegal section attribute \"%c\"",EF_ERROR,                      /* 15 */
  78.   "Section attributes don't match",EF_ERROR,
  79.   "Missing argument",EF_ERROR,
  80.   "Extra characters on line",EF_ERROR,
  81.   "Undefined symbol",EF_ERROR,
  82.   "Double unary operator",EF_ERROR,                                 /* 20 */
  83.   "Missing closing parenthesis",EF_ERROR,
  84.   "Illegal operation for a reloc expression",EF_ERROR,
  85.   "Symbols reside in different sections",EF_ERROR,
  86.   "Constant integer expression required",EF_ERROR,
  87.   "Unable to create output file \"%s\"",EF_FATAL|EF_NOLINE,         /* 25 */
  88.   "Error while writing to \"%s\"",EF_FATAL|EF_NOLINE,
  89.   "Instruction has too few operands",EF_ERROR,
  90.   "Can't assign external symbol",EF_ERROR,
  91.   "Can't assign reloc half word",EF_ERROR,
  92.   "Immediate operand doesn't fit into %d bits",EF_WARNING,          /* 30 */
  93.   "Register operand out of range",EF_ERROR,
  94.   "Reloc symbol required",EF_ERROR,
  95.   "Branch destination is not in current section",EF_WARNING,
  96.   "Branch operand out of range",EF_ERROR,
  97.   "CR-specifier out of range",EF_ERROR,                             /* 35 */
  98.   "Operand field \"%s\" out of range",EF_ERROR,
  99.   "\"%s\" is a 64-bit instruction",EF_WARNING,
  100.   "\"%s\" is an optional instruction",EF_WARNING,
  101.   "\"%s\" is a supervisor-level instruction",EF_WARNING,
  102.   "\"(rA)\" expected, after index expression",EF_ERROR,             /* 40 */
  103.   "Expression must be dividable by four",EF_ERROR,
  104.   "Invalid register field mask",EF_ERROR,
  105.   "Maximum nesting depth for conditional assembly exceeded",EF_ERROR,
  106.   "%s without matching .if",EF_ERROR,
  107.   "\"fail\" directive encountered",EF_FATAL,                        /* 45 */
  108.   "Symbol is not part of a base-relative section",EF_ERROR,
  109.   "Section \"%s\" was never defined",EF_ERROR,
  110.   "Option -%c: argument expected",EF_FATAL|EF_NOLINE,
  111.   "Unknown output format (%d)",EF_FATAL|EF_NOLINE,
  112.   "\"%s\" is not a section base address",EF_ERROR,                  /* 50 */
  113.   "Maximum of %d include paths reached. Path \"%s\" was ignored",
  114.     EF_ERROR|EF_NOLINE,
  115.   "Section \"%s\" with type #%d is not supported in EHF and was "
  116.     "changed to HUNK_DATA.",EF_WARNING|EF_NOLINE,
  117.   "Unsupported relocation type %s at offset %d in section \"%s\"",
  118.     EF_ERROR|EF_NOLINE,
  119.   "Option -%c: integer expected",EF_FATAL|EF_NOLINE,
  120.   "Absolute output doesn't allow external references. Symbol "      /* 55 */
  121.    "referenced was: %s",EF_ERROR|EF_NOLINE,
  122.   "Option -%c: symbol name expected",EF_FATAL|EF_NOLINE,
  123.   "Unknown assembler mode -m%s",EF_WARNING|EF_NOLINE,
  124. };
  125.  
  126.  
  127. void error(int errn,...)
  128. /* prints errors and warnings */
  129. {
  130.   struct GlobalVars *gv = &gvars;
  131.   va_list vl;
  132.   char *errtype;
  133.   int flags = errors[errn].flags;
  134.   struct SourceThread *mst,*st = gv->cthread;
  135.  
  136.   if (((flags&EF_TYPEMASK) == EF_WARNING) && gv->dontwarn)
  137.     return;
  138.   switch(flags&EF_TYPEMASK) {
  139.     case EF_WARNING:
  140.       errtype = "Warning";
  141.       break;
  142.     case EF_ERROR:
  143.       gv->returncode = EXIT_FAILURE;
  144.       errtype = "Error";
  145.       break;
  146.     case EF_FATAL:
  147.       gv->returncode = EXIT_FAILURE;
  148.       errtype = "Fatal error";
  149.       break;
  150.     default:
  151.       ierror("Illegal error type %d",flags&EF_TYPEMASK);
  152.       gv->returncode = EXIT_FAILURE;
  153.       errtype = "";
  154.       break;
  155.   }
  156.   if (!(flags&EF_NOLINE))
  157.     printf("\n%s\n",st->lineptr);  /* display error line */
  158.  
  159.   /* print error message */
  160.   printf("%s %d: ",errtype,errn);
  161.   va_start(vl,errn);
  162.   vprintf(errors[errn].txt,vl);
  163.   va_end(vl);
  164.   
  165.   if (!(flags&EF_NOLINE)) {
  166.     if (st->macro) {
  167.       mst = st;
  168.       do
  169.         if (!(mst = mst->prev))
  170.           ierror("There's no source text where macro \"%s\" is "
  171.                  "called from",st->csource->name);
  172.       while (mst->macro);
  173.       printf(" in line %d of macro \"%s\", called from line %d of "
  174.              "file \"%s\"",(int)st->line,st->csource->name,
  175.              (int)mst->line,mst->csource->name);
  176.     }
  177.     else
  178.       printf(" in line %d of file \"%s\"",(int)st->line,st->csource->name);
  179.   }
  180.   printf(".\n");
  181.  
  182.   switch(flags&EF_TYPEMASK) {
  183.     case EF_ERROR:
  184.       /* check if maximum number of errors reached */
  185.       if (++gv->errcnt >= gv->maxerrors) {
  186.         gv->errcnt = 0;
  187.         printf("Do you want to continue (y/n) ? ");
  188.         fflush(stdin);
  189.         if (toupper((unsigned char)getchar()) == 'N')
  190.           cleanup(gv);
  191.       }
  192.       break;
  193.     case EF_FATAL:
  194.       printf("Aborting.\n");  /* fatal error aborts the assembler */
  195.       cleanup(gv);
  196.       break;
  197.   }
  198. }
  199.  
  200.  
  201. void ierror(char *errtxt,...)
  202. /* display internal error and quit */
  203. {
  204.   struct GlobalVars *gv = &gvars;
  205.   struct SourceThread *st = gv->cthread;
  206.   va_list vl;
  207.  
  208.   printf("\nINTERNAL ERROR: ");
  209.   va_start(vl,errtxt);
  210.   vprintf(errtxt,vl);
  211.   va_end(vl);
  212.   printf(" in line %d of \"%s\".\nAborting.\n",(int)st->line,
  213.          st->csource->name);
  214.   cleanup(gv);
  215. }
  216.